"""
Ollama配置设置
管理本地LLM模型的配置参数
"""

import os
from typing import Dict, Any, List

class OllamaConfig:
    """Ollama服务配置类"""
    
    def __init__(self):
        # 基础服务配置
        self.BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")
        self.TIMEOUT = int(os.getenv("OLLAMA_TIMEOUT", "60"))
        
        # 模型配置
        self.DEFAULT_MODEL = os.getenv("OLLAMA_DEFAULT_MODEL", "qwen2.5:0.5b")
        self.ALTERNATIVE_MODELS = os.getenv("OLLAMA_ALTERNATIVE_MODELS", "qwen:latest,llama3:latest,mistral:latest").split(",")
        
        # 生成参数
        self.DEFAULT_TEMPERATURE = float(os.getenv("OLLAMA_TEMPERATURE", "0.7"))
        self.DEFAULT_MAX_TOKENS = int(os.getenv("OLLAMA_MAX_TOKENS", "2000"))
        self.DEFAULT_TOP_P = float(os.getenv("OLLAMA_TOP_P", "0.9"))
        self.DEFAULT_TOP_K = int(os.getenv("OLLAMA_TOP_K", "40"))
        
        # JH子系统特定配置
        self.JH_SYSTEM_PROMPT = self._get_jh_system_prompt()
        self.JH_CONTEXT_WINDOW = int(os.getenv("JH_CONTEXT_WINDOW", "20"))  # 保留的对话轮数
        self.JH_ENABLE_CONTEXT_ENHANCEMENT = os.getenv("JH_ENABLE_CONTEXT_ENHANCEMENT", "true").lower() == "true"
        
        # 功能开关
        self.ENABLE_STREAMING = os.getenv("OLLAMA_ENABLE_STREAMING", "true").lower() == "true"
        self.ENABLE_CONVERSATION_MEMORY = os.getenv("ENABLE_CONVERSATION_MEMORY", "true").lower() == "true"
        self.ENABLE_FALLBACK = os.getenv("ENABLE_FALLBACK", "true").lower() == "true"
        
    def _get_jh_system_prompt(self) -> str:
        """获取JH子系统的系统提示词"""
        return """你是一个专业的AI数据分析师和求职助手，专门帮助求职者分析职位市场数据和提供职业指导。你的核心能力包括：

📊 数据分析专长：
1. 图表数据解读：深入分析当前展示的图表数据，发现数据模式和趋势
2. 市场洞察分析：基于职位数据提供行业就业市场深度分析
3. 数据对比分析：对比不同维度的数据（如薪资、地区、技能等）
4. 异常值识别：识别数据中的异常模式和值得关注的点
5. 趋势预测：基于历史数据分析未来发展趋势

🎯 求职指导：
1. 简历优化建议：基于市场数据分析提供简历改进建议
2. 职业规划咨询：结合数据分析提供职业发展路径建议
3. 技能提升方向：基于热门技能数据推荐学习方向
4. 薪资期望设定：基于薪资数据分析提供合理期望建议

💡 回答特点：
- 使用中文回答，保持专业、准确、深入的分析风格
- 优先分析用户当前查看的图表数据，提供具体的数据洞察
- 结合图表数据和筛选条件提供个性化分析
- 使用具体数字和统计信息支撑分析结论
- 提供可操作的建议，避免空泛的理论
- 当数据显示明显趋势时，主动指出并解释原因

📈 数据驱动原则：
- 始终以当前图表数据为分析基础
- 结合用户的筛选条件理解用户关注点
- 引用具体的数据点和统计信息
- 识别数据中的关键模式和异常
- 提供基于数据的客观分析和建议

🚀 交互特点：
- 主动分析当前图表显示的关键信息
- 提出基于数据的深入问题和见解
- 建议用户关注数据中的重要发现
- 提供多角度的数据解读

请始终记住，你的主要任务是帮助用户理解和分析当前的图表数据，发现有价值的职场洞察。"""

    def get_model_config(self, model_name: str = None) -> Dict[str, Any]:
        """获取模型配置"""
        return {
            "model": model_name or self.DEFAULT_MODEL,
            "temperature": self.DEFAULT_TEMPERATURE,
            "max_tokens": self.DEFAULT_MAX_TOKENS,
            "top_p": self.DEFAULT_TOP_P,
            "top_k": self.DEFAULT_TOP_K,
            "stream": self.ENABLE_STREAMING
        }
    
    def get_service_config(self) -> Dict[str, Any]:
        """获取服务配置"""
        return {
            "base_url": self.BASE_URL,
            "timeout": self.TIMEOUT,
            "default_model": self.DEFAULT_MODEL,
            "alternative_models": self.ALTERNATIVE_MODELS,
            "enable_fallback": self.ENABLE_FALLBACK
        }
    
    def get_jh_config(self) -> Dict[str, Any]:
        """获取JH子系统专用配置"""
        return {
            "system_prompt": self.JH_SYSTEM_PROMPT,
            "context_window": self.JH_CONTEXT_WINDOW,
            "enable_context_enhancement": self.JH_ENABLE_CONTEXT_ENHANCEMENT,
            "enable_conversation_memory": self.ENABLE_CONVERSATION_MEMORY
        }
    
    def get_suggested_questions(self) -> List[Dict[str, List[str]]]:
        """获取建议问题列表"""
        return [
            {
                "category": "简历优化",
                "questions": [
                    "如何优化我的简历以提高通过率？",
                    "简历中应该突出哪些技能和项目经验？",
                    "如何写出吸引HR的工作经历描述？",
                    "简历的格式和排版有什么建议？",
                    "如何在简历中展示我的技术栈？"
                ]
            },
            {
                "category": "面试准备",
                "questions": [
                    "面试前需要准备哪些常见问题？",
                    "如何回答技术面试中的算法问题？",
                    "面试时如何展示我的项目经验？",
                    "如何准备行为面试问题？",
                    "远程面试有什么特别注意事项？"
                ]
            },
            {
                "category": "职业规划",
                "questions": [
                    "我应该如何规划我的职业发展路径？",
                    "哪些技能在未来3-5年会更有价值？",
                    "如何从初级开发者成长为高级工程师？",
                    "转行到数据科学领域需要什么准备？",
                    "如何选择合适的职业发展方向？"
                ]
            },
            {
                "category": "市场分析",
                "questions": [
                    "当前数据科学家的就业市场如何？",
                    "哪些城市的技术岗位机会更多？",
                    "远程工作的市场趋势是什么？",
                    "初级vs高级岗位的薪资差异有多大？",
                    "哪些技术栈目前最受欢迎？"
                ]
            },
            {
                "category": "薪资谈判",
                "questions": [
                    "如何谈判一个合理的薪资？",
                    "我的技能水平对应什么薪资范围？",
                    "跳槽时如何争取更高的薪资？",
                    "除了基本工资，还应该关注哪些福利？",
                    "如何在面试中讨论薪资期望？"
                ]
            },
            {
                "category": "技能提升",
                "questions": [
                    "我应该学习哪些新技术来提升竞争力？",
                    "如何平衡工作和技能学习的时间？",
                    "有哪些优质的学习资源推荐？",
                    "如何通过项目实践来提升技能？",
                    "开源贡献对求职有帮助吗？"
                ]
            }
        ]
    
    def validate_config(self) -> Dict[str, Any]:
        """验证配置有效性"""
        issues = []
        warnings = []
        
        # 检查URL格式
        if not self.BASE_URL.startswith(('http://', 'https://')):
            issues.append("OLLAMA_BASE_URL必须是有效的HTTP URL")
        
        # 检查参数范围
        if not 0 <= self.DEFAULT_TEMPERATURE <= 2:
            issues.append("OLLAMA_TEMPERATURE必须在0-2之间")
            
        if self.DEFAULT_MAX_TOKENS <= 0:
            issues.append("OLLAMA_MAX_TOKENS必须大于0")
            
        if not 0 <= self.DEFAULT_TOP_P <= 1:
            issues.append("OLLAMA_TOP_P必须在0-1之间")
            
        # 检查模型名称
        if not self.DEFAULT_MODEL:
            issues.append("OLLAMA_DEFAULT_MODEL不能为空")
            
        # 警告信息
        if self.TIMEOUT < 30:
            warnings.append("OLLAMA_TIMEOUT设置过低，可能导致请求超时")
            
        if self.DEFAULT_MAX_TOKENS > 4000:
            warnings.append("OLLAMA_MAX_TOKENS设置过高，可能影响性能")
        
        return {
            "valid": len(issues) == 0,
            "issues": issues,
            "warnings": warnings
        }

# 全局配置实例
ollama_config = OllamaConfig()

# 兼容性配置字典
OLLAMA_CONFIG = {
    "base_url": ollama_config.BASE_URL,
    "model_name": ollama_config.DEFAULT_MODEL,
    "timeout": ollama_config.TIMEOUT,
    "temperature": ollama_config.DEFAULT_TEMPERATURE,
    "max_tokens": ollama_config.DEFAULT_MAX_TOKENS,
    "top_p": ollama_config.DEFAULT_TOP_P,
    "top_k": ollama_config.DEFAULT_TOP_K
}

# 导出常用的配置获取函数
def get_config() -> OllamaConfig:
    """获取Ollama配置实例"""
    return ollama_config

def get_jh_config() -> Dict[str, Any]:
    """获取JH子系统配置"""
    return {
        "system_prompt": ollama_config.JH_SYSTEM_PROMPT,
        "context_window": ollama_config.JH_CONTEXT_WINDOW,
        "enable_context_enhancement": ollama_config.JH_ENABLE_CONTEXT_ENHANCEMENT
    }

def get_suggested_questions() -> List[Dict[str, Any]]:
    """获取建议问题"""
    return ollama_config.get_suggested_questions()

def get_generation_params() -> Dict[str, Any]:
    """获取生成参数"""
    return {
        "temperature": ollama_config.DEFAULT_TEMPERATURE,
        "max_tokens": ollama_config.DEFAULT_MAX_TOKENS,
        "top_p": ollama_config.DEFAULT_TOP_P,
        "top_k": ollama_config.DEFAULT_TOP_K
    } 